package bean;

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.renderable.ParameterBlock;
import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Enumeration;

import javax.imageio.ImageIO;
import javax.media.jai.JAI;
import javax.media.jai.RenderedOp;

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

public class BoardDTO {
	
		private BoardVo vo;
		private Connection conn;
		
		//페이지와 관련된 변수
		int listSize=5;	 // 페이지당 표시되는 행수
		int blockSize=5; // 한블럭당 표시되는 페이지 수
		int totSize=0;	 // 전체게시물이 계수
		int totPage=0;	 // 전체 페이지수
		int totBlock=0;	 // 전체 블럭수
		int nowPage=1;	 // 현재페이지
		int nowBlock = 1;	 // 현재블럭
		int startNo=0;	 // 리스트 목록의 시작 위치
		int endNo=0;	 // 리스트 목록의 끝 위치
		int startPage=0; // 현재블럭에서 표시되는 시작 블럭번호
		int endPage=0;	 // 현재블럭에서 표시되는 끝 블럭 번호
		
		public BoardDTO(){
			conn = new MyOracle().getConn();
		}
		
		
		public boolean login(){
			boolean b=false;
			try{
				String sql="insert into board(subject,content,mid,vno,pwd,grp,deep,wdate,mdate,tag,attfile,rno)"
						+ " values(?,?,?,?,?,?,?,?,?,?,?,seq_board_rno.nextval)";
				
				PreparedStatement pst = conn.prepareStatement(sql);
				pst.setString(1, vo.getSubject());
				pst.setString(2, vo.getContent());
				pst.setString(3, vo.getMid());
				pst.setInt(4, vo.getVno());
				pst.setString(6, vo.getPwd());
				pst.setInt(7, vo.getGrp());
				pst.setString(8, vo.getDeep());
				pst.setString(9, vo.getWdate());
				pst.setString(10, vo.getMdate());
				pst.setString(11, vo.getTag());
				pst.setString(12, vo.getAttfile());
				
				int cnt=pst.executeUpdate();
				if(cnt>0) b=true;
				
				pst.close();
				conn.close();
			}catch(Exception ex){
				ex.printStackTrace();
			}
			return b;
		}
		
		public void page(){//페이지관련 연산
			String sql = "select count(*) cnt from board"+" where mid like ?";
			try {
				PreparedStatement pst = conn.prepareStatement(sql);
				pst.setString(1, "%"+vo.getFind()+"%");
				ResultSet rs = pst.executeQuery();
				if(rs.next()){
					
					totSize = rs.getInt("cnt");
					//전체 페이지수
					totPage =(int)Math.ceil(totSize*1.0/listSize);
					//전체 블럭수
					totBlock =(int)Math.ceil(totPage*1.0/blockSize);
					
					//현재 블럭
					nowBlock = (int)Math.ceil(nowPage*1.0/blockSize);
					
					//페이지의 시작과 끝 번호
					endPage = nowBlock * blockSize; 
					startPage = endPage - blockSize+1;
					
					//게시물의 시작번호와 끝 번호
					endNo = nowPage * listSize;
					startNo = endNo - listSize+1;
					
					//endPage, endNo 보정값
					if(endPage>totPage)endPage=totPage;
					if(endNo>totSize)endNo=totSize;
				}
				System.out.println("<li>totSize=" +totSize);
				System.out.println("<li>totPage=" +totPage);
				System.out.println("<li>totBlock=" +totBlock);
				System.out.println("<li>startPage="+startPage);
				System.out.println("<li>endPage="+endPage);
				System.out.println("<li>nowBlock="+ nowBlock);
			
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
		
		
		
		public ArrayList<BoardVo> select(){
			page();
			ArrayList<BoardVo> al = new ArrayList<>();
			String sql ="select * from("
					+" select rownum rn, c.* from(" 
					+" select * from board "
					+" where mid like ? or content like ? order by rno desc )c "
					+"  )b"
					+" where b.rn between ? and ?";
			try{
				PreparedStatement pst = conn.prepareStatement(sql);
				pst.setString(1,"%"+ vo.getFind()+ "%");
				pst.setString(2,"%"+ vo.getFind()+ "%");
				pst.setInt(3, startNo);
				pst.setInt(4, endNo);
				ResultSet rs = pst.executeQuery();
				while(rs.next()){
					BoardVo v= new BoardVo();
					v.setSubject(rs.getString("subject"));
//					v.setSubject(rs.getString("grade"));
					v.setContent(rs.getString("content"));
					v.setMid(rs.getString("mid"));
//					v.setVno(rs.getInt("vno"));
//					v.setPwd(rs.getString("pwd"));
//					v.setGrp(rs.getInt("grp"));
//					v.setDeep(rs.getString("deeo"));
//					v.setWdate(rs.getString("wdate"));
////					v.setMdate(rs.getString("mdate"));
//					v.setTag(rs.getString("tag"));
//					v.setAttfile(rs.getString("attfile"));
					v.setRno(rs.getInt("rno"));
					
				
					al.add(v);
				}
				rs.close();
				pst.close();
				conn.close();
			}catch(Exception ex){
				ex.printStackTrace();
			}
			return al;
		}
		public boolean insert() {
			boolean b = false;
			String sql = "insert into board(subject,content,mid,rno)"
					+ " values(?,?,?,Seq_member_rno.nextval )";
			try {
				PreparedStatement pst = conn.prepareStatement(sql);
				pst.setString(1, vo.getSubject());
				pst.setString(2, vo.getContent());
				pst.setString(3, vo.getMid());
				int cnt = pst.executeUpdate();
				if (cnt > 0) {
					b = true;
					pst.close();
					conn.close();
				}
			} catch (Exception ex) {
				ex.printStackTrace();
			}
			return b;
		}
		public BoardVo selectOne(){
			System.out.println("11selectone");
			BoardVo v = new BoardVo();
			String sql ="select * from board where mid=?";
			try {
				PreparedStatement pst = conn.prepareStatement(sql);
				pst.setString(1, vo.getMid());//
				ResultSet rs = pst.executeQuery();
				if(rs.next()){
					v.setSubject(rs.getString("subject"));
					v.setSubject(rs.getString("grade"));
					v.setContent(rs.getString("content"));
					v.setMid(rs.getString("mid"));
					v.setVno(rs.getInt("vno"));
					v.setPwd(rs.getString("pwd"));
					v.setGrp(rs.getInt("grp"));
					v.setDeep(rs.getString("deeo"));
					v.setWdate(rs.getString("wdate"));
					v.setMdate(rs.getString("mdate"));
					v.setTag(rs.getString("tag"));
					v.setAttfile(rs.getString("attfile"));
					v.setRno(rs.getInt("rno"));
				}
				rs.close();
				pst.close();
				conn.close();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
			
			return v;
		}
		public boolean delete(){
			boolean b=false;
			String sql = "delete * from board where rno =?";
			try {
				PreparedStatement pst = conn.prepareStatement(sql);
				pst.setInt(1, vo.getRno());
				int cnt = pst.executeUpdate();
				if(cnt>0)b=true;
				
				pst.close();
				conn.close();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
			
			
			return b;
		}
		
		public BoardVo getVo() {
			return vo;
		}
		public void setVo(BoardVo vo) {
			int size = 1024 * 1024 * 10;
			String saveDir = "D:/jsy/TestWeb/WebContent/memberPhoto/";
			String oriFile = "";// original
			String sysFile = "";//
			if (vo.getRequest() != null) {
				MultipartRequest multi = null;
				try {
					multi = new MultipartRequest(vo.getRequest(), saveDir, size,
							"utf-8", new DefaultFileRenamePolicy());

					Enumeration files = multi.getFileNames();
					String tempFile = (String) files.nextElement();

					oriFile = multi.getOriginalFileName(tempFile);
					sysFile = multi.getFilesystemName(tempFile);
					
					vo.setSubject(multi.getParameter("subject"));
					vo.setContent(multi.getParameter("content"));
					vo.setMid(multi.getParameter("mid"));
					vo.setPwd(multi.getParameter("pwd"));
					vo.setDeep(multi.getParameter("wdate"));
					vo.setMdate(multi.getParameter("mdate"));
					vo.setTag(multi.getParameter("tag"));
					vo.setAttfile(multi.getParameter("attfile"));
					vo.setPhoto(sysFile);

					// thumbnail 만들기
					ParameterBlock pd = new ParameterBlock();
					pd.add(saveDir + sysFile);
					RenderedOp rOp = JAI.create("fileload", pd);

					BufferedImage bi = rOp.getAsBufferedImage();
					BufferedImage thumb = new BufferedImage(100, 100,
							BufferedImage.TYPE_INT_BGR);

					Graphics2D g = thumb.createGraphics();
					g.drawImage(bi, 0, 0, 100, 100, null);

					File file = new File(saveDir + "sm" + sysFile);
					ImageIO.write(thumb, "jpg", file);

				} catch (Exception ee) {
					ee.printStackTrace();
				}
			}
			
			this.vo = vo;
			this.nowPage = vo.getNowPage();
			this.nowBlock = vo.getNowBlock();
		}


		public Connection getConn() {
			return conn;
		}


		public void setConn(Connection conn) {
			this.conn = conn;
		}


		public int getListSize() {
			return listSize;
		}


		public void setListSize(int listSize) {
			this.listSize = listSize;
		}


		public int getBlockSize() {
			return blockSize;
		}


		public void setBlockSize(int blockSize) {
			this.blockSize = blockSize;
		}


		public int getTotSize() {
			return totSize;
		}


		public void setTotSize(int totSize) {
			this.totSize = totSize;
		}


		public int getTotPage() {
			return totPage;
		}


		public void setTotPage(int totPage) {
			this.totPage = totPage;
		}


		public int getTotBlock() {
			return totBlock;
		}


		public void setTotBlock(int totBlock) {
			this.totBlock = totBlock;
		}


		public int getNowPage() {
			return nowPage;
		}


		public void setNowPage(int nowPage) {
			this.nowPage = nowPage;
		}


		public int getNowBlock() {
			return nowBlock;
		}


		public void setNowBlock(int nowBlock) {
			this.nowBlock = nowBlock;
		}


		public int getStartNo() {
			return startNo;
		}


		public void setStartNo(int startNo) {
			this.startNo = startNo;
		}


		public int getEndNo() {
			return endNo;
		}


		public void setEndNo(int endNo) {
			this.endNo = endNo;
		}


		public int getStartPage() {
			return startPage;
		}


		public void setStartPage(int startPage) {
			this.startPage = startPage;
		}


		public int getEndPage() {
			return endPage;
		}


		public void setEndPage(int endPage) {
			this.endPage = endPage;
		}

}
